פרטים כלליים מועד הבחינה: מספר השאלון: משך הבחינה: בכל זמן 1 3 שעות מבחן 009 חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדיקות אחרונות לפני מסירה )עמודים 8-11( מבנה השאלון פרק ראשון - עיצוב תוכנה פרק שני - מודלים חישוביים שאלות )בחירה מ- 4 ( לכל שאלה 5 נקודות שאלות )בחירה מ - 4( לכל שאלה 5 נקודות סה"כ 50 נקודות סה"כ 50 נקודות תוכן עניינים של פתרון המבחן פרק ראשון - עיצוב תוכנה שאלה 1: רשימות [ פיתוח פעולה [... שאלה : עצים [ פיתוח פעולה, בניית עץ ל[י סריקות ]... שאלה 3: תור שאלה 4: טיפוסים, רשימות... [ פיתוח מחלקה ופיתוח פעולות ]... [ ניתוח פעולה מעקב וכו ] פרק שני - מודלים חישוביים שאלה 13: רגולריות- אוטומט לא דטרמיניסטי שאלה 14: ]ניתוח אוטומט, הוכחת רגולריות[... שפות רגולריות, פעולות על מילים ושפות [ השלמת מודל ]... שאלה 15: שפות רגולריות, פעולות על מילים ושפות [ נימוק נכונות של טענות ]... שאלה 16: מכונת טיורינג ]ניתוח מכונה[... הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 18
מבחן 009 פתרון שאלה 1 נושא מרכזי: רשימות סוג השאלה: פיתוח פעולה נתוני השאלה: רשימה l תיקרא משולשת אם היא מקיימת את התנאים האלה: - הרשימה אינה ריקה. - מספר האיברים בה מתחלקים ב- 3 ללא שארית. - האיברים בשליש הראשון של הרשימה מכילים את אותם ערכים שמכילים האיברים בשליש השני של הרשימה ואותם ערכים שמכילים האיברים בשליש השלישי של הרשימה. הערכים מסודרים באותו סדר בכל אחד מהשלישים. הדרישה: לכתוב פעולה המקבלת רשימה שהאיברים שלה מטיפוס שלם. אם הרשימה משולשת, הפעולה מחזירה.true אחרת- הפעולה מחזירה. גרסת פתרון 1 הסבר פתרון: הסבר הפתרון נעזר בשתי פעולות: פעולה המחזירה אורך של רשימה, ופעולה המקבלת רשימה ומיקום של איבר ברשימה, ומחזירה הפנייה לאותו איבר. נמנה את מספר האיברים ברשימה. אם מספר האיברים אינו מתחלק ב- 3 הרשימה אינה משולשת. אחרת, נמקם 3 הפניות לתחילת כל שליש ברשימה. נרוץ במקביל על שלושת השלישים ונבדוק שוויון בין האיברים. אם התגלה אי-שוויון במהלך הסריקה, הפעולה תחזיר. using System; clss Q1A public sttic bool IsTriple(List<int> l) הפעולה מקבלת רשימה ומחזירה true אם הרשימה משולשת או אחרת // int len = GetLength(l); if (len == 0 len % 3!= 0) return ; Node<int> pos1 = l.getfirst(); מיקום תחילת השליש הראשון // מיקום תחילת השליש השני // 3); / len Node<int> pos = GetPosition(l, מיקום תחילת השליש השלישי // 3); / len Node<int> pos3 = GetPosition(l, * while (pos3!= null) if (pos1.getinfo()!= pos.getinfo() pos.getinfo()!= pos3.getinfo()) return ; pos1 = pos1.getnext(); pos = pos.getnext(); pos3 = pos3.getnext(); 19 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'
return true; privte sttic int GetLength(List<int> l) הפעולה מקבלת רשימה ומחזירה את אורכה // Node<int> pos = l.getfirst(); int len = 0; while (pos!= null) len++; pos = pos.getnext(); return len;...... privte sttic Node<int> GetPosition(List<int> l, int plce) הפעולה מקבלת רשימה ומיקום איבר ברשימה // הפעולה מחזירה הפנייה לחוליה שזהו מיקומה // Node<int> pos = l.getfirst(); for (int i = 0; i < plce ; i++) pos = pos.getnext(); return pos; הסבר הפתרון גרסת פתרון הסבר פתרון: נעזר בשתי פעולות: פעולה המחזירה אורך של רשימה, ופעולה המקבלת רשימה ומיקום של איבר ברשימה, ומחזירה הפנייה לאותו איבר. נמנה את מספר האיברים ברשימה. אם מספר האיברים אינו מתחלק ב- 3 הרשימה אינה משולשת. אחרת, נמקם שתי הפניות: לתחילת השליש הראשון של הרשימה ולתחילת השליש השני של הרשימה. נרוץ במקביל עם שתי ההפניות עד שההפניה של השליש השני תגיע לסוף הרשימה. בדרך זו יבדקו שלושת השלישים מכיוון שההפניות ירוצו במקביל על שליש ראשון ושני, ולאחר מכן במקביל על שליש שני ושלישי. אם התגלה אי-שוויון במהלך הסריקה, הפעולה תחזיר. using System; clss Q1B public sttic bool IsTriple (List<int> l) הפעולה מקבלת רשימה ומחזירהtrue אם הרשימה משולשת או אחרת // int len = GetLength(l); if (len == 0 len % 3!= 0) return ; Node<int> pos1 = l.getfirst(); הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 130
Node<int> pos = GetPosition(l, len / 3); while (pos!= null) if (pos1.getinfo()!= pos.getinfo() ) return ; pos1 = pos1.getnext(); pos = pos.getnext(); return true; privte sttic int GetLength (List<int> l) Node<int> pos = l.getfirst(); int len = 0; while (pos!= null) len++; pos = pos.getnext(); return len; privte sttic Node<int> GetPosition (List<int> l, int plce) Node<int> pos = l.getfirst(); for (int i = 0; i < plce; i++) pos = pos.getnext(); return pos; פתרון שאלה נושא מרכזי: עצים סוג השאלה: פיתוח פעולה, בניית עץ לפי סריקות א. יש לכתוב פעולה בוליאנית המקבלת שורש של עץ בינארי ובודקת האם הוא עץ "ימין-שמאל". כלומר, אם לכל צומת בעץ שיש לו בן ימני יש לו גם בן-שמאלי. public sttic bool RightLeft (BinTreeNode<int> t) עץ עלה קיים מסלול אחיד // ) ==null) if (t == null (t.getleft() == null t.getright return true; אם יש בן ימני // null) if (t.getright()!= אזי אם אין בן שמאלי // null) if (t.getleft() == אזי המצב לא תקין // ; return המשך בדיקה על כל העץ // (RightLeft(t.GetLeftt() return (RightLeft(t.GetRight() && 131 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'
ב. הסבר הפתרון: עבור כל צומת בעץ, יש לבדוק אם יש לו בן ימני אזי חייב להיות לו גם בן שמאלי. אם זה מתקיים יש להמשיך ולבדוק את קיום התנאי על תת העץ השמאלי וגם על תת העץ הימני. מבנה הפעולה: אם הצומת הנוכחי לא קיים או שהוא עלה, אזי הסריקה הסתיימה באופן תקין. בדיקה האם יש לצומת בן ימני וגם בן שמאלי, אם יש ימני ואין שמאלי מוחזר. הבדיקה הכללית תצליח אם התנאי מתקיים על הצומת הנוכחי )נבדק בשלב הקודם( וגם על תת העץ השמאלי ועל תת העץ הימני. בשאלה נתונים סדר סריקה תחילי של עץ וסדר סריקה תוכי של אותו עץ. נדרש לתאר את העץ ולהציג את סדר הסריקה הסופי שלו. הסריקה התחילית הנתונה: XAIONYTDS הסריקה התוכית הנתונה: INOAXDTSY בהינתן סריקה תוכית וסריקה תחילית של עץ, קיים רק עץ אחד שיכול להתאים לתיאור. דרך הבדיקה היא עקבית ומבוצעת באופן זה: הצומת הראשון שנסרק בסריקה תחילית הוא שורש העץ לכן השורש הוא: X בסריקה תוכית, כל תת-עץ שמאל נסרק לפני השורש, וכל תת-עץ ימין נסרק אחריו, לכן נסתכל על הסריקה התוכית, נמצא בתוכה את השורש X ובהתאמה נפריד ונראה ש: INOA הם מצד שמאל של X, ו DTSY הם מצד ימין של X. X INO A DT SY באותו אופן נסתכל על הצמתים שזיהינו בצד שמאל של X. לפי הסריקה התחילית נזהה שהשורש הוא A, לפי הסריקה התוכית נראה שיתר הצמתים הם בצד שמאל של A, כי מימינו לא מופיע אף צומת. לפיכך המצב כעת הוא: X A DT SY INO בתוך הרצף,ION לפי סריקה תחילית, I הוא השורש, לכן I שמאלי ל- A. לפי הסריקה התוכית, NO מימין ל- I. שוב נסתכל על התחילית ונראה ש- O הוא השורש, ולפי התוכית N הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 13
X משמאלו. אותו היסק נבצע גם על תת העץ הימני ומתקבל העץ: סריקה סופית של העץ היא: NOIADSTYX A Y I T O D S N א. פתרון שאלה 3 נושא מרכזי: תור סוג השאלה: ניתוח פעולה, מעקב נתוני השאלה: נתונות שתי פעולות: פעולה ראשונה: מקבלת תור לא ריק המכיל מספרים שלמים. פעולה שנייה: מקבלת מספר גדול מ- 0 או שווה לו. נתון התור myqueue מטיפוס Queue<int> תשובות לסעיפים א-ה: הזימון Sod1(myQueue) יחזיר את המספר, תוך כדי הפיכת סדר האיברים בתור. i result j q return מס זימון 1) 5 5 Sod1(q) 31 4 17 5 ) 17 17 Sod1(q) 31 4 17 3) 4 4 Sod1(q) 31 4 4) 31 31 Sod1(q) 31 5) 133 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'
חזרה מזימונים רקורסיביים 4) 3) ) 31 4 17 31 4 17 31 4 31 17 4 31 1) 5 5 5 17 4 31 התור בתום המעקב: 5 17 4 31 Queue<int> ב. הפעולה Sod1(queue) בעבור תור queue הקטן ביותר בתור והופכת את אברי התור. לא ריק מטיפוס מחזירה את המספר ג. מעקב עבור הזימון :Sod(1785) i 1785 1785 178 17 1 0 i == 0 true 5 8 7 1 b Sod(1785) 8 Sod(178( 8 Sod(17) 7 Sod(1) 1 Sod(0) 0 > b true true true return 8 8 8 7 1 0 הזימון Sod(1785) יחזיר את הספרה 8. k ד. Sod(k) הפעולה במספר. בעבור מספר גדול מ- 0 מטיפוס שלם מחזירה את הספרה הגדולה ביותר ה. הפעולה מחזירה את הספרה הגדולה ביותר במספר הקטן ביותר בתור והופכת את סדר אברי התור. הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 134
פתרון שאלה 4 נושא מרכזי: טיפוסים, רשימות סוג השאלה: פיתוח מחלקה ופיתוח פעולות נתוני השאלה: תיאור של יומן אלקטרוני לניהול פגישות. היומן מכיל את הימים של שנה אחת. כל יום מיוצג על-ידי : - תאריך, הכולל חודש, יום בחודש. - רשימת הפגישות באותו יום.... נתון תיאור חלקי של המחלקה פגישה Meeting )ראה שאלון 010(. נתון חלק מממשק המחלקה יום ביומן. הדרישה: א. לכתוב את כותרת המחלקה,DyInSchedule ואת התכונות שלה. ב. לממש את הפעולה CnStrt המוצגת בממשק של המחלקה.DyInSchedule ג. לממש פעולה חיצונית שתקבל רשימה של ימים ביומן, ופגישה. הפעולה תדפיס את החודש והיום בחודש של כל אחד מהימים ברשימה, שבהם אפשר לשבץ את הפגישה... public clss DyInSchedule יום // dy; privte int חודש // month; privte int רשימת פגישות // listmetting; privte List<Meeting> public List<int> GetFreeHours() return new List<int>(); public int GetDy() return this.dy; public int GetMonth() return this.month; public bool CnStrt(int strthour, int minutes) הפעולה מקבלת שעת התחלה ומשך זמן הפגישה // הפעולה מחזירה אמת אם אפשר להתחיל את הפגישה ושקר אחרת // רשימת כל השעות הפנויות // this.getfreehours(); List<int> freehours = Node<int> pos = freehours.getfirst(); int time = minutes; מספר לא שלם של שעות // 0)!= 60 if (time % time = (time / 60) + 1; else time = time / 60; time = time + strthour; 135 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'
while (pos!= null && pos.getinfo() < strthour) התקדמות עד לשעת ההתחלה או עד סוף הרשימה // pos.getnext(); pos = if (pos == null pos.getinfo() > strthour) לא קיימת שעה פנויה // ; return int nexthour = strthour + 1; pos = pos.getnext(); while (pos!= null && nexthour < time) if (pos.getinfo()!= nexthour) return ; nexthour++; pos = pos.getnext(); return true; הסבר הפתרון הסבר פתרון לפעולה : CnStrt נחשב את משך הפגישה בשעות. אם משך הפגישה אינו שעות שלימות יש צורך להוסיף שעה עבור הדקות החורגות מאחר ופגישות מתקיימות רק בשעות שלמות. נחשב את שעת הסיום על-ידי סכום של שעת ההתחלה ומשך הפגישה. נסרוק את הרשימה כדי לבדוק אם שעת ההתחלה פנויה. אם לא לא ניתן לקיים את הפגישה. אחרת, נסרוק את המשך הרשימה כדי לבדוק אם כל השעות שבהן צריכה להתקיים הפגישה פנויות ונחזיר אמת/שקר בהתאם. clss MinQue4 public sttic void PrintAvilbleDy (List<DyInSchedule> lst, Meeting m) Node<DyInSchedule> p = lst.getfirst(); while (p!= null) מעבר על כל הימים ביומן // if (p.getinfo().cnstrt (m.getstrthour(), m.getminutes())) אם אפשר לשבץ את הפגישה // Console.WriteLine (p.getinfo().getdy()); Console.WriteLine (p.getinfo().getmonth()); p = p.getnext(); הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 136
פתרון שאלה 13 רגולריות - אוטומט לא דטרמיניסטי נושאים מרכזיים: סוג השאלה: ניתוח אוטומט, הוכחת רגולריות נתון אוטומט דטרמיניסטי לא מלא A )ראה שרטוט בשאלון(. א. A: המילים הבאות מתקבלות/לא מתקבלות על-ידי האוטומט i. המילה bbb בשפה. להלן המסלול המקבל: )1( q 0 b q 9 q 1 b q 9 b q 8 q 7 q 6 q 5 המילה bb לא בשפה. )( המילה bbb בשפה. להלן המסלול המקבל: )3( q 0 q 1 q 1 q q 3 b q 4 b q 5 b q 5 q 6.bb, bb הן: A המילים הקצרות ביותר המתקבלות על-ידי האוטומט.ii השפה L 1 L היא שפה רגולרית. 1 L 1 L = n n השפה מכילה מילים הבנויות מרצף של -ים. שפה זו ניתנת לתיאור על-ידי אוטומט סופי דטרמיניסטי מלא )או לא מלא( מאחר ונדרש מצב ה"זוכר" מופע אחד לפחות של וממנו מתקבלות רק אותיות. q 0 q 1 ב. שים : בשפה זו התבקשת לנמק אי-רגולריות ולא להוכיח ועל כן אין חובה לבנות אוטומט. פתרון שאלה 14 נושא מרכזי: אוטומט סופי דטרמיניסטי סוג השאלה: השלמת אוטומט נתוני השאלה: מילה באורך 3 תיקרא פלינדרום באורך 3, אם התו הראשון במילה שווה לתו האחרון במילה. נתונה השפה L הבאה: w היא שרשור של 0 או יותר פלינדרומים באורך 3 w L = נתון ציור חלקי של אוטומט סופי דטרמיניסטי המקבל את השפה L. b q 1 q b,b q 0 q 3 q 5 q 4 137 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'
א. האוטומט המלא שמקבל את השפה L: b b,b q 1 q,b q 0 q 3 q 5,b q 4 b ב. לא נדרש אך חשוב השפה היא: L (b) n n 0 = נימוק: השפה (b) n בנויה משלשלות של הרצף b שאינו פלינדרום. לכן, המילה המשותפת היחידה לשתי השפות היא המילה הריקה. פתרון שאלה 15 נושא מרכזי: שפות רגולריות סוג השאלה: הוכחת אי-רגולריות השפה L 1 L היא: 1 L 1 L = 0 n 1 n n השפה ) 3 Init(L היא: Init(L 3 ) = u uv L 3, u,v * = 0 i 1 i-j 1 j i 0, 0 i u = 0 i 1 i-j 0 j 1 הסבר: ) 3 Init(L אלה למעשה תת- המילים שהן התחלות )רישיות( במילים השייכות לשפה L. 3 מאחר וכל מילה בשפה היא רצף 0 ים שאחריו רצף 1 -ים כאשר מספר המופעים של 0 שווה למספר מופעי ה- 1, ניתן לחלק כל מילה להתחלה )רישא( וסיומת )סיפא(. נגדיר את ההתחלות כרצף של 0 -ים, שאחריו רצף 1 -ים הקטן ממנו כך שהסיפא תהיה רצף של 1 המשלים את מספר המופעים של 1 ברישא כך שיהיה שווה למספר ה- 0 -ים. לכן, u = 0 i 1 i-j 0 j 1 v = 1 j j 0 השפה ) 3 Fin(L היא: Fin(L 3 ) = 1 j א. ב. ג. ד. םי- הסבר ראה סעיף ב לעיל. 0011 Min(L 4 ) הסבר הפתרון נימוק: כל מילה השייכת לשפה ) 4 Min(L צריכה להיות שרשור של תתי מילים w 1 w, כך ש- :w המילה 0011 יוצרת את השרשורים הבאים כך ש-.w ו- w 1 L 4 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות' 138
0011, 0 011, 00 11, 001 1 כדי שהמילה תהיה שייכת לשפה, כל השרשורים צריכים לקיים את התנאי. השרשור 0011 אינו מקיים את התנאי w 1 L 4 מאחר ו -L 4 0011 Min(L 5 ) נימוק: )בדומה לסעיף ד לעיל( כל מילה השייכת לשפה ) 5 Min(L צריכה להיות שרשור של תתי מילים w 1 w, כך ש- w 1 L 5 ו-.w השרשורים היוצרים את המילה 0011 כאשר w הם: 1 0011, 0 011, 00 11, 001 כל אחת מההתחלות )רישות( שייכת לשפה ועל-כן המילה 0011 אינה שייכת ל- ) 5.Min(L השפה Lאינה 4 L 5 רגולרית. L 4 L 5 = 0 i 1 k 0 i k 0 i 1 k 0 k i = 0 i 1 i i 0 נימוק: מספר ה- 0 -ים בתחילת המילה צריך להיות שווה למספר ה- 1 -ים בסוף המילה. מאחר ויש תלות של מנייה בין מספר מופעי ה- 0 למספר מופעי ה- 1 ויש אינסוף אפשרויות, לא ניתן לבנות לשפה מודל המתאר שפה רגולרית. L 5 ה. ו. פתרון שאלה 16 נושאים מרכזיים: מכונת טיורינג סוג השאלה: ניתוח מכונה נתונה מכונת טיורינג... א. לאחר חישוב (5)f הסרט יכיל: 1 1 1 1 1 1 $... ב. לאחר חישוב (6)f הסרט יכיל: 1 1 1 1 1 1 $... ג. הפונקציה f(x) שהמכונה מחשבת היא: f(x) = x+x% כלומר, אם מספר ה- 1 -ים אי-זוגי יתווסף 1 ואם מספר ה- 1 -ים זוגי יישאר כפי שהיה. 139 הכנה לבגרות 015 בעיצוב +מודלים חלק ד: פתרון בגרויות כל הזכויות שמורות ל 'מבט לחלונות'